package com.lb.ai.common.response.code;

import com.lb.ai.common.response.IResultCode;
import lombok.Getter;

/**
 * 响应码模块抽象类
 * 所有响应码模块都需要继承此类，实现模块化管理
 * 
 * 模块设计规范：
 * 1. 每个模块使用一个唯一的模块代码(1-9)
 * 2. 每个模块下的错误码使用三位数(100-999)
 * 3. 最终响应码为：模块代码 * 1000 + 错误码
 * 
 * 已使用的模块代码：
 * 1 - 基础模块（HTTP标准响应码）
 * 2 - 用户模块（用户、认证、授权相关）
 * 3 - 业务模块（具体业务相关）
 * 4 - 系统模块（系统级错误）
 *
 * @author LiuB
 * @since 1.0.0
 */
@Getter
public abstract class ResultCodeModule {
    
    /**
     * 模块代码（1-9）
     * 用于区分不同模块的响应码
     */
    private final int moduleCode;
    
    /**
     * 模块描述
     * 用于描述模块的用途
     */
    private final String moduleDesc;
    
    /**
     * 构造函数
     *
     * @param moduleCode 模块代码
     * @param moduleDesc 模块描述
     * @throws IllegalArgumentException 当模块代码不在1-9范围内时抛出
     */
    protected ResultCodeModule(int moduleCode, String moduleDesc) {
        if (moduleCode < 1 || moduleCode > 9) {
            throw new IllegalArgumentException("模块代码必须在1-9范围内");
        }
        this.moduleCode = moduleCode;
        this.moduleDesc = moduleDesc;
    }
    
    /**
     * 生成完整的响应码
     * 通过模块代码和错误码生成最终的响应码
     * 
     * 例如：
     * 模块代码 = 2，错误码 = 101
     * 生成的响应码为：2101
     *
     * @param code 错误码（100-999）
     * @return 完整的响应码
     * @throws IllegalArgumentException 当错误码不在100-999范围内时抛出
     */
    protected int generateCode(int code) {
        if (code < 100 || code > 999) {
            throw new IllegalArgumentException("错误码必须在100-999范围内");
        }
        return moduleCode * 1000 + code;
    }
    
    /**
     * 获取模块下的所有响应码
     * 子类需要实现此方法，返回模块下定义的所有响应码
     *
     * @return 响应码数组
     */
    public abstract IResultCode[] getCodes();
} 